package jvm.autoMemoryManagement;

import sun.misc.Unsafe;

import java.lang.reflect.Field;

/**
 * VM Args -Xmx20M -XX:MaxDirectMemorySize=10M
 * @author msi
 * 使用unsafe分配直接内存
 */
public class DirectMemoryOOM {
    private static final int _1MB=1024*1024;

    public static void main(String[] args) throws IllegalAccessException {
        Field unsafeField = Unsafe.class.getDeclaredFields()[0];
        unsafeField.setAccessible(true);
        Unsafe unsafe = (Unsafe) unsafeField.get(null);
        while (true){
            unsafe.allocateMemory(_1MB);
        }
    }
}

/**
 *结果： java.lang.OutOfMemoryError  直接内存导致的内存溢出，一个明显的特性是在Heap Dump文件中不会看见有什么明显的异常，如果项目中出现了OOM，
 * 并且又使用了直接内存，可以检查一下直接内存溢出。
 */